home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 2
/
Gekikoh Dennoh Club Vol. 2 (Japan).7z
/
Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin
/
tools
/
psmed
/
psmed01.lzh
/
source
/
menu.c
< prev
next >
Wrap
C/C++ Source or Header
|
1997-09-04
|
5KB
|
264 lines
/*######################################
* X68 Human68k
* psmed:汎用PSMデータエディタ
*
* menu.c メニュー処理
*
* by BLACK.
*######################################
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <doslib.h>
#include "psmed.h"
#define MENU_X 20 /* メニュー表示位置 */
#define MENU_Y 5
#define MENU_ITEM_MAX 10 /* メニュー画面項目数 */
/*━━━━━━━━━━━━━━━━━━━━━━*/
static int menu_no; /* 処理中のメニュー番号 */
static int page_max; /* ページ個数 */
/*━━━━━━━━━━━━━━━━━━━━━━*/
static void menuinit(void);
static int menuedit(void);
static void pagedisp(int page);
static void item_mark(int page,int no);
/*━━━━━━━━━━━━━━━━━━━━━━*/
/**********************
* item_edit_m
* メニュー項目編集
*
**********************
*/
void edit_item_m(int no)
{
edit_t *rec;
int stat;
if (!pageedit[no]){
return;
}
rec = pageedit[no];
menu_no = rec->size;
if (!menu[menu_no]){
return;
}
if (menu_items_num[menu_no] <= 0){
return;
}
menuinit();
stat = menuedit();
if (stat < 0){
return;
}
switch (rec->cmd){
case c_menu_b:
bufset(rec->adr,1,menu_items[menu_no][stat]);
psm_edited = TRUE;
break;
case c_menu_w:
bufset(rec->adr,2,menu_items[menu_no][stat]);
psm_edited = TRUE;
break;
case c_menu_l:
bufset(rec->adr,4,menu_items[menu_no][stat]);
psm_edited = TRUE;
break;
default:
break;
}
}
/***************************
* menuinit
* メニュー初期化
*
***************************
*/
static void menuinit(void)
{
int i;
page_max = (menu_items_num[menu_no] + MENU_ITEM_MAX - 1) / MENU_ITEM_MAX;
fputs("\x1b[m",stdout);
C_LOCATE(MENU_X,MENU_Y);
fputs("┌",stdout);
for (i=0;i<MENU_ITEM_NAME_LEN/2;i++){
fputs("─",stdout);
}
fputs("┐",stdout);
for (i=0;i<MENU_ITEM_MAX;i++){
C_LOCATE(MENU_X,MENU_Y+i+1);
fputs("│",stdout);
C_LOCATE(MENU_X+2+MENU_ITEM_NAME_LEN,MENU_Y+i+1);
fputs("│",stdout);
}
C_LOCATE(MENU_X,MENU_Y+MENU_ITEM_MAX+1);
fputs("└",stdout);
for (i=0;i<MENU_ITEM_NAME_LEN/2;i++){
fputs("─",stdout);
}
fputs("┘",stdout);
pagedisp(0);
}
/***************************
* menuedit
* 編集処理
*
***************************
*/
static int menuedit(void)
{
int loop_f = TRUE;
int key;
int page = 0;
int item = 0;
int stat = -1;
while (loop_f){
key = inkey();
switch (key){
case ESC:
loop_f = FALSE;
break;
case ROLL_UP:
page++;
if (page >= page_max){
page = page_max -1;
break;
}
item = 0;
pagedisp(page);
break;
case ROLL_DOWN:
page--;
if (page < 0){
page = 0;
break;
}
item = 0;
pagedisp(page);
break;
case UP:
item--;
if (item < 0){
item = 0;
break;
}
item_mark(page,item);
break;
case DOWN:
item++;
if (item >= MENU_ITEM_MAX || menu_items_num[menu_no] <= page * MENU_ITEM_MAX + item){
item--;
break;
}
item_mark(page,item);
break;
case CR:
stat = page * MENU_ITEM_MAX + item;
loop_f = FALSE;
break;
default:
break;
}
}
return stat;
}
/***************************
* pagedisp
* ページ番号からページ表示
*
***************************
*/
static void pagedisp(int page)
{
int pos;
char *s;
int i,j;
C_LOCATE(MENU_X+MENU_ITEM_NAME_LEN-8,MENU_Y);
printf("%3d/%3d",page+1,page_max);
for (i=0;i<MENU_ITEM_MAX;i++){
C_LOCATE(MENU_X+2,MENU_Y+i+1);
pos = page * MENU_ITEM_MAX + i;
s = menu[menu_no] + MENU_ITEM_NAME_LEN * menu_items[menu_no][pos];
if (menu_items_num[menu_no] <= pos){
fputs("\x1b[35m",stdout);
for (j=0;j<MENU_ITEM_NAME_LEN/2;j++){
fputs("-",stdout);
}
fputs("\x1b[m",stdout);
}else{
printf("%-*s",MENU_ITEM_NAME_LEN,s);
}
}
item_mark(page,-1);
}
/**********************
* item_mark
* 項目に選択用カラーを付ける。
*
**********************
*/
static void item_mark(int page,int no)
{
static int old;
if (no < 0){
/* 初期化用 */
old = 0;
C_LOCATE(MENU_X+2,MENU_Y+1);
printf("\x1b[41m%-*s\x1b[m",MENU_ITEM_NAME_LEN,menu[menu_no] + MENU_ITEM_NAME_LEN * (page * MENU_ITEM_MAX));
return;
}
if (old == no){
return; /* マークは移動していない */
}
C_LOCATE(MENU_X+2,MENU_Y+1+no);
printf(
"\x1b[41m%-*s\x1b[m",
MENU_ITEM_NAME_LEN,
menu[menu_no] + MENU_ITEM_NAME_LEN * menu_items[menu_no][page * MENU_ITEM_MAX +no]
);
C_LOCATE(MENU_X+2,MENU_Y+1+old);
printf(
"\x1b[m%-*s",
MENU_ITEM_NAME_LEN,
menu[menu_no] + MENU_ITEM_NAME_LEN * menu_items[menu_no][page * MENU_ITEM_MAX + old]
);
old = no;
}